package com.eatrip.dao.implementation;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.eatrip.bean.Attrazione;
import com.eatrip.dao.AttrazioniDAO;

@Repository
@Transactional
public class AttrazioniDAOImple implements AttrazioniDAO{
	
	private HibernateTemplate hibernateTemplate;
	
	@Autowired
	public void setSessionFactory(SessionFactory sessionFactory){
		hibernateTemplate= new HibernateTemplate(sessionFactory);
	}
	
	@Autowired
	private SessionFactory sessionFactory;

	@SuppressWarnings("unchecked")
	@Override
	public Attrazione getAttrazione(int idAttrazione) {
        Attrazione attrazione= new Attrazione();
	    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Attrazione.class)
				.add(Restrictions.eq("idAttrazione", idAttrazione));
		List<Attrazione> list = criteria.list();

		if (list.size() == 0)
			return null;
		
		attrazione = list.get(0); 
		return attrazione;
	}
	
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Attrazione> getAttrazioniByComune(int idComune) {
		List<Attrazione> list=hibernateTemplate.find("FROM Attrazione WHERE idComune=?",idComune);	    	
	    if (list.size() == 0)
	    	return null;
	    return list;
		
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Attrazione> getAttrazioniByNomeComune(String nome, int start,
			int numRow) {
		List<Attrazione> list=hibernateTemplate.getSessionFactory().getCurrentSession().createQuery("SELECT at FROM Attrazione at join at.comune co  WHERE co.nome like :nome")
				.setParameter("nome", nome)
				.setFirstResult(start)
				.setMaxResults(numRow)
				.list();
	    if (list.size() == 0)
	    	return null;
	    return list;
	}

	@SuppressWarnings("unchecked")	
	@Override
	public List<Attrazione> getAttrazioniByPeriodo(Date dataInizio, Date dataFine) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Attrazione.class)
				.add(Restrictions.eq("dataInizio", dataInizio))
				.add(Restrictions.eq("dataFine", dataFine));		
		List<Attrazione> list = criteria.list();
		
		if (list.size() == 0)
		 return null;
		
		return list;
	}

	//si usa quando si hanno le liste
	@SuppressWarnings("unchecked")
	@Override
	public List<Attrazione> getAllAttrazioni() {
		// TODO Auto-generated method stub
		return hibernateTemplate.find("from Attrazione");		
	}

	@Override
	public void insertAttrazioni(Attrazione attrazione) {
		// TODO Auto-generated method stub
		hibernateTemplate.saveOrUpdate(attrazione);		
	}

	@Override
	public void deleteUser(Attrazione attrazione) {
		// TODO Auto-generated method stub
		hibernateTemplate.delete(attrazione);		
	}

	@Override
	public void deleteAllAttrazioni() {
		// TODO Auto-generated method stub
		Query q = sessionFactory.getCurrentSession().createQuery("DELETE FROM attrazioni");
		int row  = q.executeUpdate();
		if (row==0)
			System.out.println("errore nella cancellazione deleteAllUser");
	}

	@Override
	public void updateAttrazioni(Attrazione attrazione) {
		// TODO Auto-generated method stub
		hibernateTemplate.update(attrazione);
	}


	



}
